home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2888 / 2888.xpi / content / treeBuilder.js < prev    next >
Text File  |  2008-12-18  |  11KB  |  407 lines

  1. var nestedChar;
  2. var treeData=null;
  3. var foundMinimal=false;
  4. var bkmkCombos=false;
  5. var unlabeledLbl=null;
  6. var nestCount=0;
  7. function Separator(){
  8.   this.title=null;
  9.   this.type=-1;
  10.   this.freq=-1;
  11.   this.level=0;
  12. }
  13. function GMarks_LabelData(label,children, bkmk){
  14.   this.title=label;
  15.   this.type=0
  16.   this.open=false;
  17.   this.date=0;
  18.   this.freq=0;
  19.   this.level=0;
  20.   this.nestedChildren=0;
  21.   this.fullTitle=label;
  22.   if (bkmkCombos && bkmk){
  23.     this.bkmk=bkmk;
  24.     this.date=bkmk.date;
  25.   }
  26.   children=children!=null ? children: true;
  27.   if (children)
  28.     this.data=GMS.getBookmarksByLabel(label);
  29.   else
  30.     this.data=new Array();
  31.  
  32.   for (var i=0;i<this.data.length;i++){
  33.     if (this.data[i].date>this.date) this.date=this.data[i].date;
  34.     if (this.data[i].freq>this.freq) this.freq=this.data[i].freq;
  35.   }
  36. }
  37.  
  38. function BookmarkData(type,bkmk, level){
  39.   this.type=type;
  40.   this.level=level? level : type-1;
  41.   this.bkmk=bkmk;
  42. }
  43. BookmarkData.prototype={
  44.   get image(){
  45.     return this.bkmk.image;
  46.   },
  47.   set image(img){
  48.     this.bkmk.image=img;
  49.   },
  50.   get date(){
  51.     return this.bkmk.date;
  52.   },
  53.   set date(newDate){
  54.     this.bkmk.date=newDate;
  55.   },
  56.   get freq(){
  57.     return this.bkmk.freq;
  58.   },
  59.   set freq(newfreq){
  60.     this.bkmk.freq=newfreq;
  61.   },
  62.   get notes(){
  63.     return this.bkmk.notes;
  64.   },
  65.   set notes(newNotes){
  66.     this.bkmk.notes=newNotes;
  67.   },
  68.   get labels(){
  69.     return this.bkmk.labels;
  70.   },
  71.   set labels(lbls){
  72.     this.bkmk.labels=lbls;
  73.   },
  74.   get url(){
  75.     return this.bkmk.url;
  76.   },
  77.   set url(newURL){
  78.     this.bkmk.url=newURL;
  79.   },
  80.   get id(){
  81.     return this.bkmk.id;
  82.   },
  83.   set id(newId){
  84.     this.bkmk.id=newId;
  85.   },
  86.   get title(){
  87.     return this.bkmk.title;
  88.   },
  89.   set title(newTitle){
  90.     this.bkmk.title=newTitle;
  91.   },
  92.   get mode(){
  93.     return this.bkmk.mode;
  94.   },
  95.   set mode(newMode){
  96.     this.bkmk.mode=newMode;
  97.   }
  98. }
  99. function getVisibleData(type,view){
  100.   var treeData=getTreeData("",false,type);
  101.   if (type=="complete"){
  102.     if (!view) view=treeView;
  103.     view.extras=0;
  104.     if (GMS.recent.length>0 && GMS.showRecent){
  105.       view.extras++;
  106.       var recent=new GMarks_LabelData(GMS.strbundle.GetStringFromName("mostrecent"),false);
  107.       for (var i=0;i<GMS.recent.length;i++){
  108.         recent.data.push(new BookmarkData(2,GMS.recent[i]));
  109.       }
  110.       treeData.splice(view.extras-1,0,recent);
  111.     }
  112.     if (GMS.frequent.length>0 && GMS.showFreq){
  113.       view.extras++;
  114.       var frequent=new GMarks_LabelData(GMS.strbundle.GetStringFromName("mostused"),false);
  115.       for (var i=0;i<GMS.frequent.length;i++){
  116.         frequent.data.push(new BookmarkData(2,GMS.frequent[i]));
  117.       }
  118.       treeData.splice(view.extras-1,0,frequent);
  119.     }
  120.     if (view.extras>0){
  121.       view.extras++;//For the separator
  122.       treeData.splice(view.extras-1,0,new Separator());
  123.     }
  124.   }
  125.   return treeData;
  126. }
  127.  
  128. function getTreeData(aLbl,minimal,type){
  129.   var start=new Date();
  130.   var prefs = Components.classes["@mozilla.org/preferences-service;1"].
  131.             getService(Components.interfaces.nsIPrefService).getBranch("gmarks.");
  132.   nestedChar=prefs.getCharPref("nestedChar");
  133.   bkmkCombos=prefs.getBoolPref("bkmkLabelCombos");
  134.  
  135.   var lbls=aLbl.split(/\s*,\s*/);
  136.   var sepFolders=lbls.length!=1;
  137.   treeData=new Array();
  138.   for (var i=0;i<lbls.length;i++){
  139.     var lbl=lbls[i];
  140.     var curTreeData=getLabelsData(lbl,type);
  141.     if (minimal && lbl.length>0){
  142.       foundMinimal=false;
  143.       curTreeData=getMinimalTree(lbl,curTreeData);
  144.     }
  145.     if (!curTreeData) curTreeData=new Array();
  146.     if (GMS.sortBy=="date"){
  147.       sortTreeByDate(curTreeData);
  148.     }
  149.     else if (GMS.sortBy=="freq"){
  150.       sortTreeByFreq(curTreeData);
  151.     }
  152.     var end=new Date();
  153.     var total=(end.getTime()-start.getTime());
  154.     if (lbl==null || lbl.length==0){
  155.       var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
  156.                    .getService(Components.interfaces.nsIConsoleService);
  157.       var ext=GMS.mode=="google"?"GMarks":"Smarky";
  158.       //consoleService.logStringMessage(ext+" - total time: "+total);
  159.     }
  160.     if (sepFolders){
  161.       var treeLabel=new GMarks_LabelData(lbl,false);
  162.       treeLabel.data=curTreeData;
  163.       treeData.push(treeLabel);
  164.     }
  165.     else
  166.       treeData=curTreeData;
  167.   }
  168.   if (!treeData) treeData=new Array();
  169.   return treeData;
  170. }
  171. function sortTreeByDate(data){
  172.   data.sort(function (x, y){
  173.     if ((x.type!=null && x.type==0) && (y.type==null || y.type!=0)){
  174.       return -1;
  175.     }
  176.     else if ((y.type!=null && y.type==0) && (x.type==null || x.type!=0)){
  177.       return 1;
  178.     }
  179.     else if (x.date < y.date)
  180.       return 1;
  181.     else if (x.date > y.date)
  182.       return -1;
  183.     return 0;
  184.   });
  185.   for (var i=0;i<data.length;i++){
  186.     var item=data[i];
  187.     if (item.type!=null && item.type==0){
  188.       sortTreeByDate(item.data);
  189.     }
  190.   }
  191. }
  192. function sortTreeByFreq(data){
  193.   data.sort(function (x, y){
  194.     if ((x.type!=null && x.type==0) && (y.type==null || y.type!=0)){
  195.       return -1;
  196.     }
  197.     else if ((y.type!=null && y.type==0) && (x.type==null || x.type!=0)){
  198.       return 1;
  199.     }
  200.     else if (x.freq < y.freq)
  201.       return 1;
  202.     else if (x.freq > y.freq)
  203.       return -1;
  204.     else{
  205.       if (x.title.toUpperCase() > y.title.toUpperCase())
  206.         return 1;
  207.       else if (x.title.toUpperCase() < y.title.toUpperCase())
  208.         return -1;
  209.     }
  210.     return 0;
  211.   });
  212.   for (var i=0;i<data.length;i++){
  213.     var item=data[i];
  214.     if (item.type!=null && item.type==0){
  215.       sortTreeByFreq(item.data);
  216.     }
  217.   }
  218. }
  219. function getMinimalTree(lbl,ret){
  220.   for (var i=0;i<ret.length && !foundMinimal;i++){
  221.     if (ret[i].fullTitle==lbl){
  222.       //treeData=ret[i].data;
  223.       foundMinimal=true;
  224.       return ret[i].data;
  225.     }
  226.     else if (ret[i].type==0){
  227.       return getMinimalTree(lbl,ret[i].data);
  228.     }
  229.   }
  230. }
  231.  
  232. function mergeNodes(lblmain,lblnew){
  233.   if (lblnew.date > lblmain.date)
  234.   {
  235.     lblmain.date=lblnew.date;
  236.   }
  237.   if (lblnew.freq > lblmain.freq && lblnew.freq>0)
  238.   {
  239.     lblmain.freq=lblnew.freq;
  240.   }
  241. }
  242.  
  243. function getLabelsData(parentlbl,type) {
  244.   var i, j;
  245.   var ret = new Array();
  246.   var combo=bkmkCombos && parentlbl.length==0 && type=="complete";
  247.   nestCount=0;
  248.   var tmpLbl=(GMS.unlabeled.length==0?((type=="labels" || type=="details")?"Unlabeled":""):GMS.unlabeled);
  249.   if (!(((parentlbl.length==0 && tmpLbl.length>0) || (parentlbl.length!=0 && tmpLbl==parentlbl)))){
  250.     tmpLbl=null;
  251.   }
  252.   for (i=0; i < GMS.bookmarkArray.length; i++) {
  253.     for (j=0; j < GMS.bookmarkArray[i].labels.length; j++){
  254.       var lbl=GMS.bookmarkArray[i].labels[j];
  255.       if (canAdd(lbl,parentlbl,type,ret)){
  256.         addORUpdateLabel(ret,lbl,GMS.bookmarkArray[i],combo);
  257.       }
  258.     }
  259.     if (GMS.bookmarkArray[i].labels.length==0){
  260.       if (tmpLbl){
  261.         unlabeldLbl=addORUpdateLabel(ret,tmpLbl,GMS.bookmarkArray[i]);
  262.       }
  263.       else if (parentlbl.length==0 && GMS.unlabeled.length==0 && type!="labels"){
  264.         ret.splice(ret.length,0,new BookmarkData(1,GMS.bookmarkArray[i]))
  265.       }
  266.     }
  267.   }
  268.   return ret;
  269. }
  270. function addORUpdateLabel(arr, label, bkmk, combo, previous,level) {
  271.   if (level==null) level=0;
  272.   var index;
  273.   var pos=label.indexOf(nestedChar);
  274.   var front;
  275.   var fullLabel;
  276.   if(pos>-1){
  277.     front=label.substring(0,pos);
  278.     label=label.substring(pos+nestedChar.length);
  279.     index=locateLabel({title: front, type: 0},arr);
  280.   }
  281.   else{
  282.     front=label;
  283.     index = locateLabel({title: label, type: 0},arr);
  284.   }
  285.   var lbldata;
  286.   if (level==0)
  287.     fullLabel=front;
  288.   else
  289.     fullLabel=previous+nestedChar+front;
  290.   if (index>=0){//Update?
  291.     lbldata=arr[index];
  292.   }
  293.   else if (index<0){//Add
  294.     index=-(index+1);
  295.  
  296.     lbldata=new GMarks_LabelData(fullLabel,false);
  297.     lbldata.level=level;
  298.     if (pos>-1)
  299.       lbldata.title=front
  300.     else
  301.       lbldata.title=label;
  302.     arr.splice(index,0,lbldata);
  303.   }
  304.   if (pos<=0){
  305.     if (bkmk){
  306.       if (combo && bkmk.title==lbldata.title)
  307.         lbldata.bkmk=bkmk;
  308.       else
  309.         lbldata.data.push(bkmk);
  310.       mergeNodes(lbldata,bkmk);
  311.     }
  312.   }
  313.   else{
  314.     var child=addORUpdateLabel(lbldata.data,label, bkmk, combo,fullLabel,level+1);
  315.     mergeNodes(lbldata,child);
  316.   }
  317.   return lbldata;
  318. }
  319. function isHidden(label1, mainLbl){
  320.   if (label1==mainLbl) return false;
  321.   if (mainLbl.length>0 && mainLbl+nestedChar==label1.substring(0,mainLbl.length+nestedChar.length))
  322.     return false;
  323.   if (GMS.hidden.length>0){
  324.     if (GMS.hidden.indexOf(label1)>-1)
  325.       return true;
  326.     for (var i=0;i<GMS.hidden.length;i++){
  327.       if (GMS.hidden[i].length>0)
  328.         if (GMS.hidden[i]+nestedChar==label1.substring(0,GMS.hidden[i].length+nestedChar.length) &&
  329.             true)
  330.           return true;
  331.     }
  332.   }
  333.   return false;
  334. }
  335. function canAdd(lbl, parentlbl, type, currentlbls){
  336.   if (lbl==null) return false;
  337.   if (!(parentlbl.length==0 || (parentlbl==lbl
  338.       || parentlbl+nestedChar==lbl.substring(0,parentlbl.length+nestedChar.length)))){
  339.     return false;
  340.   }
  341.   //if (hasLabelData(currentlbls,lbl)) return false;
  342.   if (isHidden(lbl,parentlbl)) return false
  343.   return true;
  344. }
  345.  
  346. function locateLabel(value, a) {
  347.   var low = 0;
  348.   var high = a.length-1;
  349.   if (high==-1) return -1;
  350.   var mid=0;
  351.   var midVal;
  352.   var pos=value.title.indexOf(nestedChar);
  353.   var shortval=null;
  354.   var shortmid=null;
  355.   var compare=0;
  356.   var vType=value.type;
  357.   value=value.title.toLowerCase();
  358.   if (pos>0){
  359.     shortval=value.substring(0,pos);
  360.   }
  361.   while (low <= high) {
  362.     mid = Math.floor(low + ((high - low) / 2));
  363.     midVal=a[mid].title
  364.     pos=midVal.indexOf(nestedChar);
  365.     midVal=midVal.toLowerCase();
  366.     if (pos>0){
  367.       shortmid=midVal.substring(0,pos);
  368.     }
  369.     else shortmid=null;
  370.     compare=compareLabels(value, shortval, midVal, shortmid, vType, a[mid].type);
  371.         if (compare<0)
  372.           high = mid - 1
  373.         else if (compare>0)
  374.           low = mid + 1
  375.       else{
  376.           return mid;
  377.       }
  378.     }
  379.     if (compare<0)
  380.       return -mid-1;
  381.   else
  382.     return -mid-2;
  383. }
  384. function compareLabels(value, shortval, midvalue, shortmid, vType, mType){
  385.   var compare=0;
  386.   if (vType==mType){
  387.     var tVal=shortval==null?value:shortval;
  388.     var tMid=shortmid==null?midvalue:shortmid;
  389.     if (tVal<tMid)
  390.       compare=-1;
  391.     else if (tVal>tMid)
  392.       compare=1;
  393.     if (compare==0 && (tMid!=null || tVal!=null)){
  394.       if (value<midvalue)
  395.         compare=-1;
  396.       else if (value>midvalue)
  397.         compare=1;
  398.     }
  399.   }
  400.   else{
  401.     if (vType==null || vType>0)
  402.       return 1;
  403.     else if (mType==null || mType>0)
  404.       return -1;
  405.   }
  406.   return compare;
  407. }